// Объект Web-сокета

var Web_Socket = {  name: "localhost:8181/test",    // имя соединения
                    ws: null,           // сам объект web-сокет
                    SocketCreated: false,
                    opn: WSOpen,
                    mes: WSMessage,     // метод обработки приходящих от сервера пакетов
                    cls: WSClose,
                    err: WSError,
                    send: Send_Package, // метод оправки пакетов
                    final: Close_Connection // принудительное закрытие соединения
};

function Close_Connection() {
    // метод намеренного закрытия соединения
    if (Web_Socket.SocketCreated) {
        Web_Socket.SocketCreated = false;
        Web_Socket.ws.close();
    }
}

function WSOpen() {
    // метод, оповещающий о создании соединения
    Log("Соединение установлено.", "OK");
    document.getElementById("ToggleConnection").value = "Отключиться";
    $("#SendDataContainer").show("slow");
}

function WSClose() {
    // метод, оповещающий о закрытии соединения
    Log("Соединение закрыто.", "ERROR");
    document.getElementById("ToggleConnection").value = "Подключиться";
    $("#SendDataContainer").hide("slow");
}

function WSError() {
    // метод, оповещающий о возникшей ошибке соединения
    Log("Ошибка WebSocket.", "ERROR");
    Web_Socket.final();
    Go_Home();
}

// *** Client->Server ***
function Send_Package(packNum, info, info2) {
    // метод отправки пакетов (в зависимости от типа (номера) пакета)
    switch (packNum) {
	case 1: // тип пакета - отправка сообщений из чата: {"type": "ChatMessage", "message": "содержимое сообщения"}
        Web_Socket.ws.send('{"type": "ChatMessage", "message": "' + info + '"}');
	    break;
    case 2: // тип пакета - авторизация: {"type": "ChatMessage", "message": "nickname"}
        Web_Socket.ws.send('{"type": "ChatMessage", "message": "' + info + '"}');
        break;
    case 3: // тип пакета - создание игры: {"type": "Action", "action": "Create_game", "name": "gamename"}
        Web_Socket.ws.send('{"type": "Action", "action": "Create_game", "name": "' + info + '"}');
        break;
    case 4: // тип пакета - получение списка игр: {"type": "Action", "action": "Get_gamelist"}
        Web_Socket.ws.send('{"type": "Action", "action": "Get_gamelist"}');
        break;
    case 5: // тип пакета - подключение к игре: {"type": "Action", "action": "Join_game", "name": "gamename"}
        Web_Socket.ws.send('{"type": "Action", "action": "Join_game", "name": "' + info + '"}');
        break;
    case 6: // тип пакета - получение списка карт: {"type":"Action","action":"Get_maplist"}
        Web_Socket.ws.send('{"type":"Action","action":"Get_maplist"}');
        break;
    case 7: /* тип пакета - получение списка игроков в игре:
               {"type": "Action", "action": "Get_playerlist", "gamename": "gamename", "team": "NONE"}
               {"type": "Action", "action": "Get_playerlist", "gamename": "gamename", "team": "A"}
               {"type": "Action", "action": "Get_playerlist", "gamename": "gamename", "team": "B"}
            */
        Web_Socket.ws.send('{"type": "Action", "action": "Get_playerlist", "gamename": "'
                + info + '", "team": "NONE"}');
        Web_Socket.ws.send('{"type": "Action", "action": "Get_playerlist", "gamename": "'
                + info + '", "team": "A"}');
        Web_Socket.ws.send('{"type": "Action", "action": "Get_playerlist", "gamename": "'
                + info + '", "team": "B"}');
        break;
    case 8: /* тип пакета - выбор карты:
               {"type": "Action", "action": "Choose_map", "gamename": "gamename", "mapname": "default"}*/
            var str = '{"type": "Action", "action": "Choose_map", "gamename": "'
                + info + '", "mapname": "' + info2 + '"}';
        Web_Socket.ws.send('{"type": "Action", "action": "Choose_map", "gamename": "'
                + info + '", "mapname": "' + info2 + '"}');
        break;
    case 9: /* тип пакета - выбор команды:
               {"type": "Action", "action": "Choose_team", "gamename": "gamename", "team": "A"}
               {"type": "Action", "action": "Choose_team", "gamename": "gamename", "team": "B"}
               {"type": "Action", "action": "Choose_team", "gamename": "gamename", "team": "NONE"}
            */
             var str1 = '{"type": "Action", "action": "Choose_map", "gamename": "'
                + info + '", "mapname": "' + info2 + '"}';
        Web_Socket.ws.send('{"type": "Action", "action": "Choose_team", "gamename": "'
                + info + '", "team": "' + info2 + '"}');
        break;
    case 10: // тип пакета - начать игру: {"type": "Action", "action": "Start_game", "gamename": "gamename"}
             var str2 = '{"type": "Action", "action": "Choose_map", "gamename": "'
                + info + '", "mapname": "' + info2 + '"}';
        Web_Socket.ws.send('{"type": "Action", "action": "Start_game", "gamename": "' + info + '"}');
        break;
    case 11: // тип пакета - выйти из города: {"type": "Action", "action": "Get_the_hero_out_of_town"}
        Web_Socket.ws.send('{"type": "Action", "action": "Get_the_hero_out_of_town"}');
        break;
    case 12: // тип пакета - войти в город: {"type": "Action", "action": "Enter_the_hero_in_town"}
        Web_Socket.ws.send('{"type": "Action", "action": "Enter_the_hero_in_town"}');
        break;
    case 13: // тип пакета - герой ходит: {"type": "Action", "action": "Hero_goes", "xcoords": "x", "ycoords": "y"}
        Web_Socket.ws.send('{"type": "Action", "action": "Hero_goes", "xcoords": "'
                + info + '", "ycoords": "' + info2 + '"}');
        break;
    case 14: /* тип пакета - установить флаг на ресурсе:
                {"type": "Action", "action": "Set_the_flag_on_the_resource", "xcoords": "x", "ycoords": "y"}
             */
        Web_Socket.ws.send('{"type": "Action", "action": "Set_the_flag_on_the_resource", "xcoords": "'
                + info + '", "ycoords": "' + info2 + '"}');
        break;
    }
}

//*** Server -> Client ***
function WSMessage(event) {
    // обработчик приходящих от сервера пакетов
	var obj = JSON.parse(event.data);   // распарсиваем пришедшие данные
	if(obj.type == "ChatMessage") {
	    /* обработка сообщений из чата:
           {"type": "ChatMessage", "login": "nickname", "message": "содержимое сообщения"}
	    */
		View_In_Chat('"'+obj.login+'": '+obj.message);
	}
    if(obj.type == "YourChatAuth") {
        // обработка "вашей" авторизации
        if (obj.status == "OK") {
            // {"type": "YourChatAuth", "login": "nickname", "status": "OK", "reason": "0"}
            Log(obj.login + " присоединился.");
            Gamer.name = obj.login;
            Choice();           
        }
        if (obj.status == "ERR") { // если пользователь с таким именем уже существует
            // {"type": "YourChatAuth", "login": "nickname", "status": "ERR", "reason": "1"}
        }
	}
    if(obj.type == "OtherCharAuth") {
        // обработка "не вашей" авторизации: {"type": "OtherCharAuth", "login": "nickname"}
		Log(obj.login + " присоединился.");
	}
	if(obj.type == "ChatUserDisconnect") {
	    // отсоединение пользователя: {"type": "ChatUserDisconnect", "login": "nickname"}
		Log(obj.login + " отсоединился.");
	}
    if (obj.type == "Action") { // если тип "Action"
        if (obj.action == "Send_gamelist") {
            /* получение списка доступных игр:
               {"type":"Action","action":"Send_gamelist","names":["gamename","gamename2"]}
            */
            if (obj.names.length) {
                $("#GameList").show("slow");
                document.getElementById("GameList").innerHTML = "<a><h4>Список игр</h4></a>";
                document.getElementById("SelectGame").innerHTML = "";
                for (var i = 0; i < obj.names.length; i++) {
                    document.getElementById("GameList").innerHTML += '<p>' + obj.names[i] + '</p>';
                    document.getElementById("SelectGame").innerHTML += '<option>' + obj.names[i] + '</option>';
                }
            }
        }
        if (obj.action == "Create_game") { // создание игры
            if (obj.status == "OK") {
                /* сервер разрешает создать игру:
                   {"type": "Action", "action": "Create_game", "status": "OK", "reason": "0"}
                */
                NewGameCanBeCreated();
            }
            if (obj.status == "ERR") {
                /* сервер не разрешает создать игру:
                   {"type": "Action", "action": "Create_game", "status": "ERR", "reason": "номер_причины"}
                */
            }
        }
        if (obj.action == "Send_playerlist") {
                /* сервер присылает список игроков в текущей игре:
                   {"type": "Action", "action": "Send_playerlist", "names": ["player1", "player2", "player3"]}
                */
        }
        if (obj.action == "Join_game") { // присоединение к игре
            if (obj.status == "OK") {
                /* сервер разрешает присоединиться к игре:
                   {"type": "Action", "action": "Join_game", "status": "OK", "reason": "0"}
                */
                View_Choice_Game();
            }
            if (obj.status == "ERR") {
                /* сервер не разрешает присоединиться к игре:
                   {"type": "Action", "action": "Join_game", "status": "ERR", "reason": "номер_причины"}
                */
            }
        }
        if (obj.action == "Send_maplist") {
            /* сервер присылает список карт, имеющихся у него:
               {"type": "Action", "action": "Send_maplist", "maps": ["name1", "name2", "name3"]}
            */
            if (obj.maps.length) {
                $("#MapList").show("slow");
                document.getElementById("MapList").innerHTML = "<a><h4>Список карт</h4></a>";
                document.getElementById("SelectMap").innerHTML = "";
                for (var i = 0; i < obj.maps.length; i++) {
                    document.getElementById("MapList").innerHTML += '<p>' + obj.maps[i] + '</p>';
                    document.getElementById("SelectMap").innerHTML += '<option>' + obj.maps[i] + '</option>';
                }
            }
        }
        if (obj.action == "Choose_map") { // выбор карты
            if (obj.status == "OK") {
                /* сервер разрешет выбрать карту:
                   {"type": "Action", "action": "Choose_map", "status": "OK", "reason": "0"}
                */
                MapChosen();
            }
            if (obj.status == "ERR") {
                /* сервер не разрешает выбрать карту:
                   {"type": "Action", "action": "Choose_map", "status": "ERR", "reason": "номер_причины"}
                */
            }
        }
        if (obj.action == "Choose_team") { // выбор команды
            if (obj.status == "OK") {
                /* сервер разрешает выбрать команду:
                   {"type": "Action", "action": "Choose_team", "status": "OK", "reason": "0"}
                */
                TeamChosen();
            }
            if (obj.status == "ERR") {
                /* сервер не разрешает выбрать команду:
                   {"type": "Action", "action": "Choose_team", "status": "ERR", "reason": "номер_причины"}
                */
            }
        }
        if (obj.action == "Start_game") { // начало игры
            if (obj.status == "OK") {
                /* сервер позволяет начать игру:
                   {"type": "Action", "action": "Start_game", "status": "OK", "reason": "0"}
                */
                init();
            }
            if (obj.status == "ERR") {
                /* сервер не позволяет начать игру:
                   {"type": "Action", "action": "Start_game", "status": "ERR", "reason": "0"}
                */
            }
        }
        
    }
    Log(event.data);    // отображение всех пакетов от сервера
}